window.onload=function ()
{
    const students=[];
    students.push(new Student('12023020101','王逸皓','男','18','人工智能学院','软件工程','大一','1'));
    students.push(new Student('12023020102','王二狗','男','19','人工智能学院','软件工程','大二','2'));
    students.push(new Student('12023020103','王三狗','男','17','人工智能学院','软件工程','大一','4'));
    students.push(new Student('12023020104','王四狗','男','20','计算机学院','计算机科学与技术','大三','5'));
    students.push(new Student('12023020105','吴亦凡','男','23','机械仿生学院','人体仿生电鳗学','大四','3'));
    students.push(new Student('12023020106','刘昊然','男','20','计算机学院','计算机科学与技术','大一','2'));
    students.push(new Student('12023020107','李大鹏','男','21','计算机学院','计算机科学与技术','大一','2'));
    students.push(new Student('12023020108','古天乐','男','22','计算机学院','计算机科学与技术','大一','1'));
    students.push(new Student('12023020109','海浩','男','18','人工智能学院','计算机科学与技术','大二','1'));
    students.push(new Student('12023020110','塔特图','男','18','会计学院','会计学','大四','4'));
    students.push(new Student('12023020111','克莱尔','女','18','会计学院','会计学','大一','4'));
    students.push(new Student('12023020112','普特','男','18','国际学院','国际关系','大一','1'));
    students.push(new Student('12023020113','拉格朗日','男','19','知识产权学院','商务英语','大三','3'));
    students.push(new Student('12023020114','嬴政','男','21','马克思学院','社会关系','大二','4'));
    students.push(new Student('12023020115','罗斯福','男','19','马克思学院','社会主义与资本主义的兼容','大三','1'));
    students.push(new Student('12023020116','甘地','男','18','国际学院','核平卫士','大三','2'));
    students.push(new Student('12023020117','特朗普','男','20','计算机学院','社交媒体与政治哲学','大二','1'));
    students.push(new Student('12023020118','李彦宏','男','21','计算机学院','大数据','大三','2'));
    students.push(new Student('12023020119','花木兰','女','19','人民武装学院','击剑','大一','2'));
    students.push(new Student('12023020120','宋美龄','女','18','知识产权学院','产权保护','大二','3'));
    students.push(new Student('12023020121','伊丽莎白','女','19','国际学院','国际关系','大一','2'));
    students.push(new Student('12023020122','菲利普二世','男','20','外语学院','西班牙语','大三','4'));
    students.push(new Student('12023020123','华盛顿','男','20','国际学院','民族独立学','大一','3'));
    students.push(new Student('12023020124','弘历','男','20','中文学院','八股文','大二','4'));
    students.push(new Student('12023020125','绯村剑心','男','21','人民武装学院','飞天御剑流','大三','1'));

    //student对象
    function Student(id,name,sex,age,faculty,major,grade,classR)
    {
        this.id=id;
        this.name=name;
        this.sex=sex;
        this.age=age;
        this.faculty=faculty;
        this.major=major;
        this.grade=grade;
        this.classR=classR;
        this.isChosen=false;
    }
    //常量
    const numberOfPage=10;//每一页显示的数量
    const arrOfFlag=[];//标记数组
    const symbolChi=/^[\u4e00-\u9fa5]+$/;//检验是否为汉字的正则表达式
    const symbolNum=/^\d+$/;//检验是否为数字的正则表达式



   //元素获取
    const table=getById('table');//获取表格
    const dynamicPage=getById('page');//获取页码
    const alerts=getById('curtain');//弹窗
    const alertTitle=getById('alertTitle');//弹窗标题
    const sId=getById('sId');//学号表头
    const tipCur=getById('tipCurtain');

    //按钮获取
    const nextPage=getById('next');//下一页
    const lastPage=getById('last');//上一页
    const chooseAll=getById('chooseAll');//全选
    const deleteBt=getById('delete');//删除
    const check=getById('check');//查看
    const change=getById('change');//修改
    const add=getById('add');//新增
    const close=getById('close');
    const save=getById('save');//保存
    const logout=getById('logout');//退出
    const confirm=getById('confirm');//确认
    const cancel=getById('cancel');//取消

    /*全局变量*/
    let page=1;//当前的页数
    let allPage=computeAllPage(students.length);//计算总的页数
    let flagOfCha=false;//全选按钮的标志
    let editable=false;//弹窗的可编辑性
    let isSortBySid=false;
    let isBlank=false;//弹窗内容是否为空？
    let flagDel=false;
    let wrong=[];
    generateTable(1);//生成第一页的表格
    reset();

    //计算总页数
    function computeAllPage(length)
    {
        let pages;
        if(length%10===0&&length!==0)
        {
            pages=(length/10);
        }
        else if(length===0)
        {
            pages=1;
        }
        else
        {
            pages=(length/10)+1;
        }
        //执行两次按位取反，保留整数
        return ~~pages;
    }
    //重置页面显示
    function reset()
    {
        printPage();
        clickClo();
    }
    //清空页面
    function clearPage()
    {
        let numberOfPrint=computeLastIndex();
        //每一页删除10行,最后一页删除对应的行数
        for(let i=(page-1)*10;i<numberOfPrint;i++)
        {
            let tr=getById('clo'+i);
            tr.remove();
        }
    }
    /*检验是否合法的id*/
    function isValidId(str)//首位不为0,且长度在10-15之间的数字学号
    {
        let flag=false;
        if(str[0]!=='0'&&(str.length>=10&&str.length<=15)&&symbolNum.test(str)===true)
        {
            flag=true;
        }
        if(isBlank===true)
        {
            for(let i=0;i<students.length;i++)
            {
                if(students[i].id===str)
                {
                    flag=false;
                    break;
                }
            }
        }

        return flag;
    }
    /*检验是否合法的名字*/
    function isValidName(str)
    {
        if(str.length===0||str.length>6)
        {
            return false;
        }
        return symbolChi.test(str);
    }
    /*检验是否合法的性别*/
    function isValidSex(str)
    {
        return str === '男' || str === '女';
    }
    //合法的年龄
    function isValidAge(str)
    {
        return !(symbolNum.test(str) === false || parseInt(str) < 0 || parseInt(str) > 30);
    }
    //合法的学院
    function isValidFaculty(str)
    {
        if(symbolChi.test(str) === true&&str.length>2)
        {
            if((str[str.length-2]+str[str.length-1])==="学院")
            {
                return true;
            }
        }
        return false;
    }
    //合法的专业
    function isValidMajor(str)
    {
        return symbolChi.test(str);
    }
    //合法的年级
    function isValidGrade(str)
    {
        if(symbolChi.test(str) === true&&str.length===2)
        {
            if(str[0]==="大"||str[0]==="研")
            {
                if(str[1]==="一"||str[1]==="二"||str[1]==="三"||str[1]==="四")
                {
                    return true;
                }
            }
        }
        return false;
    }
    //合法的班级
    function isValidClassR(str)
    {
        return parseInt(str) > 0 && symbolNum.test(str) === true;
    }
    function personCheck(person)
    {
        if(isValidId(person.id)===false)
        {
            wrong.push(1);
        }
        if (isValidName(person.name)===false)
        {
            wrong.push(2);
        }
        if(isValidSex(person.sex)===false)
        {
            wrong.push(3);
        }
        if(isValidAge(person.age)===false)
        {
            wrong.push(4);
        }
        if(isValidFaculty(person.faculty)===false)
        {
            wrong.push(5);
        }
        if(isValidMajor(person.major)===false)
        {
            wrong.push(6);
        }
        if(isValidGrade(person.grade)===false)
        {
            wrong.push(7);
        }

        if(isValidClassR(person.classR)===false)
        {
            wrong.push(8);
        }
        return error();
    }
    function error()
    {
        if(wrong.length!==0)
        {
            for(let i in wrong)
            {
                let input=getById("input"+wrong[i]);
                input.parentElement.style.borderBottom="4px solid #ff0000";
            }
            return false;
        }
        else
        {
            return true;
        }

    }
    //通过id获取元素
    function getById(id)
    {
        return document.getElementById(id);
    }
    //通过学号获取学生对象的下标
    function getStudentBySD(StudentID)
    {
        for(let i=0;i<students.length;i++)
        {
            if(StudentID===students[i].id)
            {
                return i;
            }
        }
    }
    //计算当前页面最后一个对象的下标
    function computeLastIndex()
    {
        let numberOfPrint=numberOfPage*page;
        if(page===allPage)///如果为最后一页
        {
            numberOfPrint=students.length;//最后一个的下标设置为数组的长度
        }
        return numberOfPrint;
    }

    //显示页码
    function printPage()
    {
        if(page<10)
        {
            dynamicPage.innerHTML='第 '+page+' 页(共 '+allPage+' 页)';
        }
        else
        {
            dynamicPage.innerHTML='第'+page+'页(共 '+allPage+' 页)';
        }
    }
    /*显示小窗口*/
    function displayPop()
    {
        //仅能同时查看/修改一个学生
        //标记数组里面只有一个学生 或 标记数组里无学生但表单属性为空
        if(arrOfFlag.length===1||(arrOfFlag.length===0&&isBlank===true))
        {
            alerts.style.display='block';//显示弹窗
            let studentId=arrOfFlag[0];//获取被选中的学号
            let i=getStudentBySD(studentId);//通过学号获取该学生在对象数组里的下标
            let person=students[i];//通过下标获取该学生对象
            let count=1;
            if(arrOfFlag.length===0||isBlank===true)
            {
                save.style.display='block';//显示保存按钮
                for(let i=0;i<9;i++)
                {
                    let input=getById('input'+count);//获取对应输入框
                    if(isBlank===true)//表单是否为空
                    {
                        input.value='';
                        input.style.pointerEvents='auto';//可被编辑
                    }
                }
            }
            else
            {
                for(let factor in person)
                {

                    if(count>8)
                    {
                        break;
                    }
                    else
                    {
                        let input=getById('input'+count);

                        if(person.hasOwnProperty(factor))
                        {
                            input.value=person[factor]//赋值
                        }
                        if(editable===false)
                        {
                            input.style.pointerEvents='none';//不可被编辑
                            save.style.display='none';//隐藏保存按钮
                        }
                        else
                        {
                            input.style.pointerEvents='auto';//可被编辑
                            save.style.display='block';//显示保存按钮
                        }
                        count++;//获取下一个输入框
                    }
                }
            }
        }
    }
    //确认按钮
    confirm.onclick=function ()
    {
        flagDel=true;
        deleteBto();
        tipCur.style.display='none';
    }
    //取消按钮
    cancel.onclick=function ()
    {
        tipCur.style.display='none';
    }
    function tip(str)
    {
        let tipContent=getById('tipIc');
        tipContent.innerHTML=str;
        tipCur.style.display='block';
    }
    function clearForm()
    {
        for(let i=1;i<9;i++)
        {
            let input=getById('input'+i);
            input.value="";
        }

    }
    //将错误的表单清空
    function reScan()
    {
        for(let i in wrong)
        {
            let input=getById('input'+wrong[i]);
            input.value='';
        }
        while(wrong.length!==0)
        {
            wrong.pop();
        }
    }
    //颜色重置
    function reWrong()
    {
        for(let i=1;i<9;i++)
        {
            let input=getById('input'+i);
            input.parentElement.style.borderBottom="4px solid #0077aa";
        }
    }
    //动态生成表格
    function generateTable(page)
    {
        let numberOfPrint=computeLastIndex();
        //每一页创建10行
        for(let i=(page-1)*10;i<numberOfPrint;i++)
        {
            //创建行
            let tr=document.createElement('tr');
            tr.className='clo';
            tr.id='clo'+i;
            table.appendChild(tr);
            //隔行换色
            if(i%2===1)
            {
                tr.style.backgroundColor='rgb(237,241,247)';
            }
            //添加序号单元格
            let num=document.createElement('td');
            num.innerHTML=(String)(i+1);
            tr.appendChild(num);
            //创建单元格
            let count=0;
            for(let factor in students[i])
            {
                if(count>7)
                {
                    break;
                }
                else
                {
                    if(students[i].hasOwnProperty(factor))//属性检查
                    {
                        let td=document.createElement('td');
                        td.innerHTML=students[i][factor];
                        tr.appendChild(td);
                        count++;
                    }
                }

            }
            if(beChosen(i))
            {
                tr.style.backgroundColor='rgb(120,204,255)';
            }
        }
    }
    //是否被选中
    function beChosen(i)
    {
        for(let k=0;k<arrOfFlag.length;k++)
        {
            if(students[i].id===arrOfFlag[k])
            {
                return true;
            }
        }
        return false;
    }

    //退出按钮
    logout.addEventListener('click',exit)
    function exit()
    {
        window.location.href='http://localhost:63342/project4/login/html/login.html?_ijt=bqn2hjl0i7885l4r2ntckhu3hj';
    }
    //下一页按钮
    nextPage.addEventListener('click',next);
    function next()
    {
        if(page<allPage)
        {
            clearPage(page);
            page++;
            generateTable(page);
            reset();
        }else if(page===allPage)
        {
            fadeInOut("已经是最后一页了!");
        }
    }
    function fadeInOut(str)
    {

        let quickTip=$('#quickTip');
        let quickTipC=$('#quickTipC');
        quickTipC.html(str);
        quickTip.fadeIn(500).fadeOut(500);
    }

    //上一页按钮
    lastPage.addEventListener('click',last);
    function last()
    {
        if(page>1)
        {
            clearPage(page);
            page--;
            generateTable(page);
            reset();
        }else if(page===1)
        {
           fadeInOut("已经是第一页了!");
        }
    }
    //全选按钮
    chooseAll.addEventListener('click',all)
    function all()
    {
        //单击
        if(flagOfCha===false)
        {
            for(let i=(page-1)*10;i<computeLastIndex();i++)
            {
                let  tr=getById('clo'+i);
                students[i].isChosen=true;//将该学生对象属性更新为被选中
                tr.style.backgroundColor='rgb(120,204,255)';
                if(!beChosen(i))
                {
                    arrOfFlag.push(students[i].id);
                }
            }
            flagOfCha=true;
        }
        //双击
        else
        {
            for(let i=(page-1)*10;i<computeLastIndex();i++)
            {
                let  tr=getById('clo'+i);
                if(beChosen(i))
                {
                    students[i].isChosen=false;//属性更新为未被选中
                    //删除标记数组中的对应标记
                    for(let k=0;k<arrOfFlag.length;k++)
                    {
                        if(arrOfFlag[k]===students[i].id)
                        {
                            arrOfFlag.splice(k,1);
                            break;
                        }
                    }
                }
                if(i%2===1)
                {
                    tr.style.backgroundColor='rgb(237,241,247)';
                }
                else
                {
                    tr.style.backgroundColor='rgb(255,255,255)';
                }
            }
            flagOfCha=false;
        }
    }
    //行选中
    function clickClo()
    {
        let numberOfPrint=computeLastIndex();
        for(let i=(page-1)*10;i<numberOfPrint;i++)
        {
            let tr=getById('clo'+i);
            tr.onclick=function ()
            {
                //单击
                if(students[i].isChosen===false&&!beChosen(i))
                {
                    tr.style.backgroundColor='rgb(120,204,255)';
                    arrOfFlag.push(students[i].id);//单击被选中后，将此对象的学号添加至标记数组
                    students[i].isChosen=true;
                }
                else if(students[i].isChosen===true&&beChosen(i))//双击取消选中
                {
                    //将标记数组中的对象下标删除
                    let key=beChosen(i);//是否被选中
                        for(let k=0;k<arrOfFlag.length;k++)
                        {
                            if(key===true&&students[i].id===arrOfFlag[k])
                            {
                                arrOfFlag.splice(k,1);
                            }
                        }

                    if(i%2===1)
                    {
                        tr.style.backgroundColor='rgb(237,241,247)';
                    }
                    else
                    {
                        tr.style.backgroundColor='rgb(255,255,255)';
                    }
                    students[i].isChosen=false;
                }
            }
        }
    }
    //删除按钮
    deleteBt.addEventListener('click',deleteE);
    function deleteE()
    {

        if(arrOfFlag.length!==0&&flagOfCha===false) {
            tip("确认删除该学生?");
        }
        else if(arrOfFlag.length!==0&&flagOfCha===true)
        {
            tip("确认全部删除?");
        }
        else if(students.length===0)
        {
            fadeInOut("学生已全被删除!");
        }
        else
        {
            fadeInOut("无学生被选中!");
        }
    }
    function deleteBto()
    {
                clearPage();//清空
                while(arrOfFlag.length!==0)//直到标记数组为空时删除完毕
                {
                    for (let i = 0; i < arrOfFlag.length; i++) {
                        for (let j = 0; j < students.length; j++) {
                            if (students[j].id === arrOfFlag[i])//找到相同的id
                            {

                                //对象数组删除对应的对象
                                students.splice(j, 1);
                                //标记数组删除对应的标记
                                arrOfFlag.splice(i, 1);
                                //重新计算总页数
                                allPage = computeAllPage(students.length);
                            }
                        }
                    }
                }
                //在删除最后一页时删除全部元素后，自动跳转到上一页
                if(page>allPage)
                {
                    page--;
                    generateTable(page);
                }
                else
                {
                    generateTable(page);
                }
                flagOfCha=false;
                reset();
    }
    //按照学号排序
    sId.addEventListener('click',sortBySid);
    function sortBySid()
    {

        if(isSortBySid===true)
        {
            students.sort(function (a,b)
            {
                return a.id-b.id;
            })
            isSortBySid=false;
        }
        else
        {
            isSortBySid=true;
            students.sort(function (a,b)
            {
                return b.id-a.id;
            })
        }
        clearPage();
        generateTable(page);
        reset();
    }
    $('#menu').click(function ()
    {
        $('#add').fadeToggle(200);
        $('#change').fadeToggle(400);
        $('#check').fadeToggle(600);
        $('#chooseAll').fadeToggle(800);
        $('#delete').fadeToggle(1000);
        $('#last').fadeToggle(1200);
        $('#next').fadeToggle(1400);
        $('#logout').fadeToggle(1600);

    })
    /*关闭弹窗按钮*/
    close.addEventListener('click',closeBt);
    function closeBt(){

        alerts.style.display='none';
        isBlank=false;//表单不为空
        clearForm();//清空表单里面的内容
        reWrong();
        reScan();
    }
    //新增按钮
    add.addEventListener('click',addOne);
    function addOne()
    {
        isBlank=true;//表单为空
        alertTitle.innerHTML='&#xe602;学生个人信息表';
        displayPop();//显示弹窗
    }
    //查看按钮
    check.addEventListener('click',checkBt);
    function checkBt()
    {
        if(arrOfFlag.length!==0)
        {
            editable=false;//不可修改
            alertTitle.innerHTML='&#xe608;学生个人信息表';
            displayPop();//显示弹窗
        }
        else
        {
            fadeInOut("无学生被选中!");
        }

    }
    /*修改按钮*/
    change.addEventListener('click',changeBt)
    function changeBt()
    {
        if(arrOfFlag.length!==0)
        {
            editable=true;//小窗口可编辑
            alertTitle.innerHTML='&#xe61d;学生个人信息表';
            displayPop();//显示弹窗
        }else
        {
            fadeInOut("无学生被选中!");
        }

    }
    //保存按钮
    save.addEventListener('click',saveBt)
    function saveBt()
    {
        let copyPerson=new Student();//新建一个student对象
        let count=1;
        let flag=getStudentBySD(arrOfFlag[0]);//获取当前被选中学生的下标

        for(let factor in copyPerson)//将表单的内容传递给复制人
        {
            if(count>8)//只传递前8项属性
            {
                break;
            }
            else
            {
                if(copyPerson.hasOwnProperty(factor))//属性检查
                {
                    let input=getById('input'+count);
                    copyPerson[factor]=input.value;
                    count++;
                }
            }
        }
        //检验合法才会进行数据保存操作
        if(personCheck(copyPerson)===true)
        {
            clearPage();//清空页面
            if(editable === true&&arrOfFlag.length===1)//修改
            {
                copyPerson.isChosen=true;//已经被选中
                students[flag]=copyPerson;//修改对象数组内的对象
            }
            else if(arrOfFlag.length===1&&isBlank===true)//指定位置新增
            {
                students.splice(flag+1,0,copyPerson);//将复制人插入到指定位置的下一行
                isBlank=false;//表单不为空
            }
            else if(arrOfFlag.length===0&&isBlank===true)//默认位置新增
            {
                students.push(copyPerson)//将复制人添加到末尾
                isBlank=false;//表单不为空
            }

            allPage=computeAllPage(students.length);//重新计算总页数
            generateTable(page);//重新生成表格
            printPage();//打印页码
            closeBt();//关闭页面
            reset();
        }
        else
        {
           reScan();
        }
    }
}